{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 20.29178738594055\n",
      "10 18.157113194465637\n",
      "20 17.455609679222107\n",
      "30 16.499610781669617\n",
      "40 15.60313868522644\n",
      "50 15.89236831665039\n",
      "60 14.15184736251831\n",
      "70 12.326170325279236\n",
      "80 10.348144292831421\n",
      "90 9.535945057868958\n"
     ]
    }
   ],
   "source": [
    "from __future__ import unicode_literals, print_function, division\n",
    "from io import open\n",
    "import unicodedata\n",
    "import string\n",
    "import re\n",
    "import random\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch import optim\n",
    "import torch.nn.functional as F\n",
    "\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "class EncoderRNN(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(EncoderRNN, self).__init__()\n",
    "        self.hidden_size = hidden_size\n",
    "        self.embedding = nn.Embedding(input_size, hidden_size)\n",
    "        self.gru = nn.GRU(hidden_size, hidden_size)\n",
    "        self.out = nn.Linear(hidden_size, input_size)\n",
    "        self.softmax = nn.LogSoftmax(dim=1)\n",
    "        \n",
    "\n",
    "    def forward(self, input, hidden):\n",
    "        embedded = self.embedding(input).view(1, 1, -1)\n",
    "        output, hidden = self.gru(embedded, hidden)\n",
    "        output = self.out(output[0]) \n",
    "        output = self.softmax(output)\n",
    "        return output, hidden\n",
    "\n",
    "    def initHidden(self):\n",
    "        return torch.zeros(1, 1, self.hidden_size, device=device)\n",
    "    \n",
    "def oneHot(idx):\n",
    "    x = torch.zeros(10).float()\n",
    "    x[idx] = 1.0\n",
    "    return x\n",
    "\n",
    "# input_data = list(zip(range(0,8),range(1,9)))+[[8,9],[9,0]]\n",
    "# output_data = list(range(2,10))+[0,1]\n",
    "\n",
    "input_data = list(zip(range(0,8),range(1,9)))\n",
    "output_data = list(range(2,10))\n",
    "pairs= list(zip(input_data,output_data))\n",
    "\n",
    "def tensorsFromPair(pair):\n",
    "    input_tensor = torch.tensor(pair[0], dtype=torch.long, device=device).view(-1, 1)\n",
    "    target_tensor = torch.tensor(pair[1], dtype=torch.long, device=device).view(-1, 1)\n",
    "    return (input_tensor, target_tensor)\n",
    "\n",
    "input_size, hidden_size = 10, 2\n",
    "n_iters = 1\n",
    "encoder = EncoderRNN(input_size, hidden_size).to(device)\n",
    "learning_rate = 0.05\n",
    "\n",
    "encoder_optimizer = optim.SGD(encoder.parameters(), lr=learning_rate)\n",
    "encoder_hidden = encoder.initHidden()\n",
    "criterion = nn.NLLLoss()\n",
    "\n",
    "A=[]\n",
    "for epoch in range(100):\n",
    "    training_pairs = [tensorsFromPair(pair) for pair in pairs]\n",
    "    a=0\n",
    "    for _ in range(len(training_pairs)):\n",
    "        i = random.choice(range(8))\n",
    "        loss = 0\n",
    "        training_pair = training_pairs[i]\n",
    "        input_tensor = training_pair[0]\n",
    "        target_tensor = training_pair[1]\n",
    "\n",
    "        encoder_optimizer.zero_grad()\n",
    "\n",
    "        input_length = input_tensor.size(0)\n",
    "        target_length = target_tensor.size(0)\n",
    "\n",
    "        for ei in range(2):\n",
    "            encoder_output, encoder_hidden = encoder(input_tensor[ei], encoder_hidden)\n",
    "        loss += criterion(encoder_output, target_tensor[0])\n",
    "\n",
    "        loss.backward(retain_graph=True)\n",
    "        encoder_optimizer.step()\n",
    "        a+=loss.item()\n",
    "    A.append(a/n_iters)\n",
    "    if epoch%10==0:\n",
    "        print(epoch,a/n_iters)\n",
    "    \n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 1.975058126449585\n",
      "10 1.9347392082214356\n",
      "20 1.903801727294922\n",
      "30 1.8754781246185304\n",
      "40 1.8493281364440919\n",
      "50 1.8249556064605712\n",
      "60 1.8019652843475342\n",
      "70 1.779932165145874\n",
      "80 1.7583593845367431\n",
      "90 1.7366591453552247\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(100):\n",
    "    training_pairs = [tensorsFromPair(pair) for pair in pairs]\n",
    "    a=0\n",
    "    for _ in range(len(training_pairs)):\n",
    "        i = random.choice(range(8))\n",
    "        loss = 0\n",
    "        training_pair = training_pairs[i]\n",
    "        input_tensor = training_pair[0]\n",
    "        target_tensor = training_pair[1]\n",
    "\n",
    "        encoder_optimizer.zero_grad()\n",
    "\n",
    "        input_length = input_tensor.size(0)\n",
    "        target_length = target_tensor.size(0)\n",
    "\n",
    "        for ei in range(2):\n",
    "            encoder_output, encoder_hidden = encoder(input_tensor[ei], encoder_hidden)\n",
    "        loss += criterion(encoder_output, target_tensor[0])\n",
    "\n",
    "        loss.backward(retain_graph=True)\n",
    "        encoder_optimizer.step()\n",
    "        a+=loss.item()\n",
    "    A.append(a/n_iters)\n",
    "    if epoch%10==0:\n",
    "        print(epoch,a/n_iters)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(A)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "W1 = encoder.embedding.weight.data.numpy()\n",
    "x, y = W1[:,0],W1[:,1]\n",
    "plt.plot(x,y,'ro-')\n",
    "for  i in range(10):\n",
    "    plt.text(x[i],y[i],str(i))\n",
    "\n",
    "\n",
    "W2 = encoder.out.weight.data.numpy().T\n",
    "x, y = W2[0,:],W2[1,:]\n",
    "plt.plot(x,y,'bo-')\n",
    "for  i in range(10):\n",
    "    plt.text(x[i],y[i],str(i))\n",
    "#plt.savefig('dafengche.png')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0], [1]]\n",
      "pred: 2 true: 2\n",
      "[[1], [2]]\n",
      "pred: 3 true: 3\n",
      "[[2], [3]]\n",
      "pred: 4 true: 4\n",
      "[[3], [4]]\n",
      "pred: 5 true: 5\n",
      "[[4], [5]]\n",
      "pred: 9 true: 6\n",
      "[[5], [6]]\n",
      "pred: 8 true: 7\n",
      "[[6], [7]]\n",
      "pred: 8 true: 8\n",
      "[[7], [8]]\n",
      "pred: 9 true: 9\n"
     ]
    }
   ],
   "source": [
    "training_pairs = [tensorsFromPair(pairs[i]) for i in range(8)]\n",
    "a=0\n",
    "for i in range(8):\n",
    "    training_pair = training_pairs[i]\n",
    "    input_tensor = training_pair[0]\n",
    "    target_tensor = training_pair[1]\n",
    "    print(input_tensor.tolist())\n",
    "    for ei in range(2):\n",
    "            encoder_output, encoder_hidden = encoder(input_tensor[ei], encoder_hidden)\n",
    "    print(\"pred:\",encoder_output.topk(1)[1].item(),\"true:\", target_tensor[0].item())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "'numpy.ndarray' object is not callable",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-77-03ad01cf447f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mW2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m: 'numpy.ndarray' object is not callable"
     ]
    }
   ],
   "source": [
    "W2.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
